Qtize garmin_tables (#1357)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Wed, 23 Oct 2024 13:45:26 +0000 (07:45 -0600)
committerGitHub <noreply@github.com>
Wed, 23 Oct 2024 13:45:26 +0000 (07:45 -0600)
exif.cc
garmin_icon_tables.h
garmin_tables.cc
garmin_tables.h
garmin_txt.cc
garmin_txt.h
gpx.cc
mkicondoc.cc
unicsv.cc

diff --git a/exif.cc b/exif.cc
index e38714cffc8a6f78d6dab23a979c52b967ddbebc..4f6ec2c29532981320f59fe5460e858929483abc 100644 (file)
--- a/exif.cc
+++ b/exif.cc
@@ -854,7 +854,7 @@ ExifFormat::exif_waypt_from_exif_app(ExifApp* app) const
     printf(MYNAME "-GPSLongitude = %12.7f\n", wpt->longitude);
   }
   if (!datum.isEmpty()) {
-    int idatum = gt_lookup_datum_index(datum.constData(), MYNAME);
+    int idatum = gt_lookup_datum_index(datum, MYNAME);
     if (idatum < 0) {
       fatal(MYNAME ": Unknown GPSMapDatum \"%s\"!\n", datum.constData());
     }
index a4e4fff6238b4de45924d6821183984eff7f76d5..3bc67a917b5e7113641df78c54db46ff7ecce326 100644 (file)
 #ifndef GARMIN_ICON_TABLES_H
 #define GARMIN_ICON_TABLES_H
 
+#include <QString>
+#include <QVector>
+
 #include "garmin_tables.h"
 
+struct icon_mapping_t {
+  int mpssymnum;
+  int pcxsymnum;
+  QString icon;
+};
+
 /* MapSource 4.13 */
-const icon_mapping_t garmin_icon_table[] = {
+static const QVector<icon_mapping_t> garmin_icon_table = {
   /*     mps    pcx    desc */
   {   107, 16384, "Airport" },
   {    73,  8204, "Amusement Park" },
@@ -333,12 +342,9 @@ const icon_mapping_t garmin_icon_table[] = {
   { 246, -1, "Upland Game" },
   { 247, -1, "Waterfowl" },
   { 248, -1, "Water Source" },
-
-
-  {    -1,    -1, nullptr },
 };
 
-const icon_mapping_t garmin_smart_icon_table[] = {
+static const QVector<icon_mapping_t> garmin_smart_icon_table = {
   /* Additional (optional, activated with -Si) icons */
   {    92,  8227, "Micro-Cache" },     /* icon for "Toll Booth" */
   {    48,   161, "Virtual cache" },   /* icon for "Scenic Area" */
@@ -348,6 +354,5 @@ const icon_mapping_t garmin_smart_icon_table[] = {
   {    83,  8214, "Post Office" },     /* Icon for "Post Office" */
   {    47,   160, "Event Cache" },     /* Icon for "Event" */
   {    90,  8221, "Webcam Cache" },    /* Icon for "Live Theatre" */
-  {    -1,    -1, nullptr }
 };
 #endif // GARMIN_ICON_TABLES_H
index fb67d4b98ab364939edae31b892af210a0c53014..09bd9457604422e6b05a8ffb27dec094bf0a0884 100644 (file)
 
 #include <cstdint>               // for int32_t
 #include <cstring>               // for strncpy, strchr, strlen, strncmp
+
 #include <QChar>                 // for operator==, QChar
 #include <QDebug>                // for QDebug
+#include <QVector>               // for QVector
 #include <Qt>                    // for CaseInsensitive
+
 #include "defs.h"
 #include "garmin_tables.h"
 #include "jeeps/gpsmath.h"       // for GPS_Lookup_Datum_Index, GPS_Math_Get_Datum_Name
 // these tables are in an include file so they can be shared with mkicondoc.
 #include "garmin_icon_tables.h"  // for garmin_icon_table, garmin_smart_icon_table
 
+
+#define DEFAULT_ICON_DESCR "Waypoint"
+#define DEFAULT_ICON_VALUE 18
+
 /* ICAO country code table */
 
 /* source: https://en.wikipedia.org/wiki/ICAO_airport_code */
 
-const gt_country_code_t gt_country_codes[] = {
+struct gt_country_code_t {
+  const char* cc;
+  const char* country;
+};
+
+static const gt_country_code_t gt_country_codes[] = {
   { "ZM,", "Mongolia" },
   { "ZK,", "North Korea" },
   { "Z*,", "China" },
@@ -267,7 +279,7 @@ const gt_country_code_t gt_country_codes[] = {
 };
 
 /* gt_waypt_classes: gdb internal order */
-const char* const gt_waypt_class_names[] = {
+const QStringList gt_waypt_class_names = {
   "User Waypoint",
   "Airport",
   "Intersection",
@@ -281,43 +293,41 @@ const char* const gt_waypt_class_names[] = {
   "Map Intersection",
   "Map Address",
   "Map Line",
-  nullptr
 };
 
 /* gt_display_mode_names: this order is used by most devices */
-const char* const gt_display_mode_names[] = {
+const QStringList gt_display_mode_names = {
   "Symbol & Name",
   "Symbol",
   "Symbol & Description"
 };
 
 struct grid_mapping_t {
-  const char* shortname;
-  const char* longname;
+  QString shortname;
+  QString longname;
   grid_type grid;
 };
 
 /* gt_mps_grid_names: !!! degree sign substituted with '*' !!! */
 
-static const grid_mapping_t gt_mps_grid_names[] = {
+static const QVector<grid_mapping_t> gt_mps_grid_names = {
   { "ddd",     "Lat/Lon hddd.ddddd*",          grid_lat_lon_ddd },
   { "dmm",     "Lat/Lon hddd*mm.mmm'",         grid_lat_lon_dmm },
   { "dms",     "Lat/Lon hddd*mm'ss.s\"",       grid_lat_lon_dms },
   { "bng",     "British National Grid",        grid_bng },
   { "utm",     "UTM",                          grid_utm },
   { "swiss",   "Swiss grid",                   grid_swiss },
-  { nullptr,   nullptr,        (grid_type) 0 }
 };
 
 /* gt_mps_datum_names: */
 
 struct datum_mapping_t {
-  const char* jeeps_name;
-  const char* mps_name;
+  QString jeeps_name;
+  QString mps_name;
 };
 
 /* will be continued (when requested) */
-static const datum_mapping_t gt_mps_datum_names[] = {
+static const QVector<datum_mapping_t> gt_mps_datum_names = {
   { "Alaska-NAD27",    "NAD27 Alaska" },
   { "Bahamas NAD27",   "NAD27 Bahamas" },
   { "Canada_Mean(NAD27)",      "NAD27 Canada" },
@@ -330,15 +340,14 @@ static const datum_mapping_t gt_mps_datum_names[] = {
   { "Mexico NAD27",    "NAD27 Mexico" },
   { "North America 83",        "NAD83" },
   { "OSGB36",          "Ord Srvy Grt Britn" },
-  { nullptr,   nullptr }
 };
 
 struct garmin_color_t {
-  const char* name;
+  QString name;
   int32_t rgb;
 };
 
-static const garmin_color_t gt_colors[] = {
+static const QVector<garmin_color_t> gt_colors = {
   { "Unknown",         unknown_color },
   { "Black",           0x000000 },
   { "DarkRed",         0x00008B },
@@ -357,11 +366,8 @@ static const garmin_color_t gt_colors[] = {
   { "Cyan",            0xFFFF00 },
   { "White",           0xFFFFFF },
   { "Transparent",     unknown_color }, /* Currently not handled */
-  { nullptr, 0 }
 };
 
-#define GT_COLORS_CT ((sizeof(gt_colors) / sizeof(gt_colors[0])) - 1)
-
 unsigned char
 gt_switch_display_mode_value(const unsigned char display_mode, const int protoid, const char device)
 {
@@ -431,18 +437,18 @@ gt_find_desc_from_icon_number(const int icon, garmin_formats_e garmin_format)
     return QStringLiteral("Custom %1").arg(icon - 7680);
   }
 
-  for (const icon_mapping_t* i = garmin_icon_table; i->icon; i++) {
+  for (const auto& icon_mapping : garmin_icon_table) {
     switch (garmin_format) {
     case MAPSOURCE:
     case GDB:
-      if (icon == i->mpssymnum) {
-        return i->icon;
+      if (icon == icon_mapping.mpssymnum) {
+        return icon_mapping.icon;
       }
       break;
     case PCX:
     case GARMIN_SERIAL:
-      if (icon == i->pcxsymnum) {
-        return i->icon;
+      if (icon == icon_mapping.pcxsymnum) {
+        return icon_mapping.icon;
       }
       break;
     default:
@@ -455,7 +461,6 @@ gt_find_desc_from_icon_number(const int icon, garmin_formats_e garmin_format)
 int gt_find_icon_number_from_desc(const QString& desc, garmin_formats_e garmin_format)
 {
   static int find_flag = 0;
-  const icon_mapping_t* i;
   int def_icon = DEFAULT_ICON_VALUE;
 
   if (desc.isNull()) {
@@ -485,29 +490,31 @@ int gt_find_icon_number_from_desc(const QString& desc, garmin_formats_e garmin_f
     }
   }
 
-  for (i = garmin_smart_icon_table; global_opts.smart_icons && i->icon; i++) {
-    if (desc.compare(i->icon, Qt::CaseInsensitive) == 0) {
-      switch (garmin_format) {
-      case MAPSOURCE:
-      case GDB:
-        return i->mpssymnum;
-      case PCX:
-      case GARMIN_SERIAL:
-        return i->pcxsymnum;
-      default:
-        fatal(MYNAME ": unknown garmin format.\n");
+  if (global_opts.smart_icons) {
+    for (const auto& icon_mapping : garmin_smart_icon_table) {
+      if (desc.compare(icon_mapping.icon, Qt::CaseInsensitive) == 0) {
+        switch (garmin_format) {
+        case MAPSOURCE:
+        case GDB:
+          return icon_mapping.mpssymnum;
+        case PCX:
+        case GARMIN_SERIAL:
+          return icon_mapping.pcxsymnum;
+        default:
+          fatal(MYNAME ": unknown garmin format.\n");
+        }
       }
     }
   }
-  for (i = garmin_icon_table; i->icon; i++) {
-    if (desc.compare(i->icon, Qt::CaseInsensitive) == 0) {
+  for (const auto& icon_mapping : garmin_icon_table) {
+    if (desc.compare(icon_mapping.icon, Qt::CaseInsensitive) == 0) {
       switch (garmin_format) {
       case MAPSOURCE:
       case GDB:
-        return i->mpssymnum;
+        return icon_mapping.mpssymnum;
       case PCX:
       case GARMIN_SERIAL:
-        return i->pcxsymnum;
+        return icon_mapping.pcxsymnum;
       default:
         fatal(MYNAME ": unknown garmin format.\n");
       }
@@ -520,16 +527,16 @@ int gt_find_icon_number_from_desc(const QString& desc, garmin_formats_e garmin_f
    */
 
   if (find_flag == 0) {
-    const char* prefixes[] = {
-      "White ", "Red ", "Green ", "Blue ", "Black ", nullptr
+    static const QStringList prefixes = {
+      "White ", "Red ", "Green ", "Blue ", "Black ",
     };
     // Rewrite "Green Square" to "Square, Green".
-    for (const char** prefix = prefixes; *prefix != nullptr; prefix++) {
-      if (desc.startsWith(*prefix, Qt::CaseInsensitive)) {
+    for (const auto& prefix : prefixes) {
+      if (desc.startsWith(prefix, Qt::CaseInsensitive)) {
         QString buff = desc;
-        buff.replace(*prefix, "");
+        buff.replace(prefix, "");
         buff.append(", ");
-        buff.append(*prefix);
+        buff.append(prefix);
         buff = buff.trimmed();
 
         find_flag = 1;
@@ -641,52 +648,55 @@ gt_get_icao_cc(const QString& country, const QString& shortname)
 }
 
 grid_type
-gt_lookup_grid_type(const char* grid_name, const QString& module)
+gt_lookup_grid_type(const QString& grid_name, const QString& module)
 {
-  for (const grid_mapping_t* g = gt_mps_grid_names; (g->shortname); g++) {
-    if (QString::compare(grid_name, g->shortname, Qt::CaseInsensitive) == 0 ||
-        QString::compare(grid_name, g->longname,Qt::CaseInsensitive) == 0) {
-      return g->grid;
+  for (const auto& grid_mapping : gt_mps_grid_names) {
+    if (QString::compare(grid_name, grid_mapping.shortname, Qt::CaseInsensitive) == 0 ||
+        QString::compare(grid_name, grid_mapping.longname,Qt::CaseInsensitive) == 0) {
+      return grid_mapping.grid;
     }
   }
 
-  fatal(FatalMsg() << module << ": Unsupported grid (" << grid_name <<
-                       ". See GPSBabel help for supported grids.\n");
+  fatal(FatalMsg().nospace().noquote() << module <<
+        ": Unsupported grid (" << grid_name <<
+        "). See GPSBabel help for supported grids.");
 
   return grid_unknown; /* (warnings) */
 }
 
-const char*
-gt_get_mps_grid_longname(const grid_type grid, const char* module)
+QString
+gt_get_mps_grid_longname(const grid_type grid, const QString& module)
 {
-  if ((grid < GRID_INDEX_MIN) || (grid > GRID_INDEX_MAX))
-    fatal("%s: Grid index out of range %d (%d..%d)!",
-          module, (int) grid,
-          (int)GRID_INDEX_MIN, (int)GRID_INDEX_MAX);
+  if ((grid < GRID_INDEX_MIN) || (grid > GRID_INDEX_MAX)) {
+    fatal(FatalMsg().nospace().noquote() << module <<
+          ": Grid index out of range " << grid <<
+          " (" << GRID_INDEX_MIN << ".." << GRID_INDEX_MAX << ")!");
+  }
   return gt_mps_grid_names[grid].longname;
 }
 
-const char*
+QString
 gt_get_mps_datum_name(const int datum_index)
 {
-  const char* result = GPS_Math_Get_Datum_Name(datum_index);
+  QString result = GPS_Math_Get_Datum_Name(datum_index);
 
-  for (const datum_mapping_t* d = gt_mps_datum_names; (d->jeeps_name); d++)
-    if (QString::compare(result, d->jeeps_name, Qt::CaseInsensitive) == 0) {
-      return d->mps_name;
+  for (const auto& datum_mapping : gt_mps_datum_names) {
+    if (QString::compare(result, datum_mapping.jeeps_name, Qt::CaseInsensitive) == 0) {
+      return datum_mapping.mps_name;
     }
+  }
 
   return result;
 }
 
 int
-gt_lookup_datum_index(const char* datum_str, const QString& module)
+gt_lookup_datum_index(const QString& datum_str, const QString& module)
 {
-  const char* name = datum_str;
+  QString name = datum_str;
 
-  for (const datum_mapping_t* d = gt_mps_datum_names; (d->jeeps_name); d++) {
-    if (QString::compare(name, d->mps_name, Qt::CaseInsensitive) == 0) {
-      name = d->jeeps_name;
+  for (const auto& datum_mapping : gt_mps_datum_names) {
+    if (QString::compare(name, datum_mapping.mps_name, Qt::CaseInsensitive) == 0) {
+      name = datum_mapping.jeeps_name;
       break;
     }
   }
@@ -695,13 +705,14 @@ gt_lookup_datum_index(const char* datum_str, const QString& module)
 
   // Didn't get a hit?  Try again after modifying the lookup.
   if (result < 0) {
-    QString tmp = QString(datum_str) + " mean";
+    QString tmp = datum_str + " mean";
     result = GPS_Lookup_Datum_Index(tmp);
   }
 
   if (result < 0) {
-    fatal(FatalMsg() << module << ": Unsupported datum (" << datum_str <<
-                         "). See GPSBabel help for supported datums.");
+    fatal(FatalMsg().nospace().noquote() << module <<
+          ": Unsupported datum (" << datum_str <<
+          "). See GPSBabel help for supported datums.");
   }
   return result;
 }
@@ -709,7 +720,7 @@ gt_lookup_datum_index(const char* datum_str, const QString& module)
 uint32_t
 gt_color_value(const unsigned int garmin_index)
 {
-  if ((garmin_index < GT_COLORS_CT)) {
+  if ((garmin_index < gt_colors.size())) {
     return gt_colors[garmin_index].rgb;
   } else {
     return unknown_color;  /* -1 */
@@ -719,10 +730,11 @@ gt_color_value(const unsigned int garmin_index)
 uint32_t
 gt_color_value_by_name(const QString& name)
 {
-  for (unsigned int i = 0; i < GT_COLORS_CT; i++)
+  for (int i = 0; i < gt_colors.size(); ++i) {
     if (QString::compare(gt_colors[i].name, name, Qt::CaseInsensitive) == 0) {
       return gt_colors[i].rgb;
     }
+  }
 
   return gt_colors[0].rgb;
 }
@@ -730,10 +742,11 @@ gt_color_value_by_name(const QString& name)
 int
 gt_color_index_by_name(const QString& name)
 {
-  for (unsigned int i = 0; i < GT_COLORS_CT; i++)
+  for (int i = 0; i < gt_colors.size(); ++i) {
     if (QString::compare(gt_colors[i].name, name, Qt::CaseInsensitive) == 0) {
       return i;
     }
+  }
 
   return 0; /* unknown */
 }
@@ -741,18 +754,19 @@ gt_color_index_by_name(const QString& name)
 int
 gt_color_index_by_rgb(const int rgb)
 {
-  for (unsigned int i = 0; i < GT_COLORS_CT; i++)
+  for (int i = 0; i < gt_colors.size(); ++i) {
     if (rgb == gt_colors[i].rgb) {
       return i;
     }
+  }
 
   return 0; /* unknown */
 }
 
-const char*
+QString
 gt_color_name(const unsigned int garmin_index)
 {
-  if ((garmin_index < GT_COLORS_CT)) {
+  if ((garmin_index < gt_colors.size())) {
     return gt_colors[garmin_index].name;
   } else {
     return gt_colors[0].name;
index 47dc7b2e0a4091905edaac9fe5dcef9e728d3622..303fa12875c5fe88461ca26d3db71afe9b72d162 100644 (file)
 #include <QString>              // for QString
 #include "defs.h"               // for grid_type
 
-#define DEFAULT_ICON_DESCR "Waypoint"
-#define DEFAULT_ICON_VALUE 18
-
-struct icon_mapping_t {
-  int mpssymnum;
-  int pcxsymnum;
-  const char* icon;
-};
 
 enum garmin_formats_e {MAPSOURCE, PCX, GARMIN_SERIAL, GDB};
 
 QString gt_find_desc_from_icon_number(int icon, garmin_formats_e garmin_format);
 int gt_find_icon_number_from_desc(const QString& desc, garmin_formats_e garmin_format);
 
-extern const icon_mapping_t garmin_icon_table[];
-
 enum gt_waypt_classes_e {
   gt_waypt_class_user_waypoint = 0,
   gt_waypt_class_airport,
@@ -59,14 +49,7 @@ enum gt_waypt_classes_e {
   gt_waypt_class_map_line
 };
 
-extern const char* const gt_waypt_class_names[];
-
-struct gt_country_code_t {
-  const char* cc;
-  const char* country;
-};
-
-extern const gt_country_code_t gt_country_codes[];
+extern const QStringList gt_waypt_class_names;
 
 const char* gt_get_icao_country(const QString& cc);
 const char* gt_get_icao_cc(const QString& country, const QString& shortname);
@@ -78,10 +61,7 @@ enum gt_display_modes_e {
   gt_display_mode_symbol_and_comment
 };
 
-extern const char* const gt_display_mode_names[];
-
-#define GT_DISPLAY_MODE_MIN gt_display_mode_symbol_and_name
-#define GT_DISPLAY_MODE_MAX gt_display_mode_symbol_and_comment
+extern const QStringList gt_display_mode_names;
 
 enum gt_gdb_display_modes_e {
   gt_gdb_display_mode_symbol = 0,
@@ -89,18 +69,16 @@ enum gt_gdb_display_modes_e {
   gt_gdb_display_mode_symbol_and_comment
 };
 
-unsigned char gt_convert_category(const char* name, int* category);
-
 unsigned char gt_switch_display_mode_value(unsigned char display_mode, int protoid, char device);
 
-grid_type gt_lookup_grid_type(const char* grid_name, const QString& module);
-const char* gt_get_mps_grid_longname(grid_type grid, const char* module);
-int gt_lookup_datum_index(const char* datum_str, const QString& module);
-const char* gt_get_mps_datum_name(int datum_index);
+grid_type gt_lookup_grid_type(const QString& grid_name, const QString& module);
+QString gt_get_mps_grid_longname(grid_type grid, const QString& module);
+int gt_lookup_datum_index(const QString& datum_str, const QString& module);
+QString gt_get_mps_datum_name(int datum_index);
 uint32_t gt_color_value(unsigned int garmin_index);
 uint32_t gt_color_value_by_name(const QString& name);
 int gt_color_index_by_name(const QString& name);
 int gt_color_index_by_rgb(int rgb);
-const char* gt_color_name(unsigned int garmin_index);
+QString gt_color_name(unsigned int garmin_index);
 
 #endif
index 455fced792115a289115bbb696677d89c4d0696b..e52a681985a61b63d556c5be1df185832c278b81 100644 (file)
@@ -33,7 +33,6 @@
 #include <ctime>                   // for gmtime, time_t, localtime, strftime, tm
 
 #include <optional>                // for optional
-#include <type_traits>             // for add_const_t
 #include <utility>                 // for pair, as_const, make_pair
 #include <QByteArray>              // for QByteArray
 #include <QChar>                   // for QChar, QChar::Other_Control
@@ -72,16 +71,6 @@ const QVector<QString> GarminTxtFormat::headers = {
   "Name\tStart Time\tElapsed Time\tLength\tAverage Speed\tLink"
 };
 
-inline gt_display_modes_e& operator++(gt_display_modes_e& s) // prefix
-{
-  return s = static_cast<gt_display_modes_e>(s + 1);
-}
-inline gt_display_modes_e operator++(gt_display_modes_e& s, int) // postfix
-{
-  gt_display_modes_e ret(s);
-  ++s;
-  return ret;
-}
 
 bool GarminTxtFormat::is_valid_alt(double alt)
 {
@@ -273,7 +262,7 @@ GarminTxtFormat::print_position(const Waypoint* wpt)
     fatal(MYNAME ": %s (%s) is outside of convertible area \"%s\"!\n",
           wpt->shortname.isEmpty() ? "Waypoint" : qPrintable(wpt->shortname),
           qPrintable(pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, false)),
-          gt_get_mps_grid_longname(grid_index, MYNAME));
+          qPrintable(gt_get_mps_grid_longname(grid_index, MYNAME)));
   }
 }
 
@@ -419,18 +408,18 @@ GarminTxtFormat::print_string(const char* fmt, const QString& string)
 void
 GarminTxtFormat::write_waypt(const Waypoint* wpt)
 {
-  const char* wpt_type;
+  QString wpt_type;
 
   const garmin_fs_t* gmsd = garmin_fs_t::find(wpt);
 
   int i = garmin_fs_t::get_display(gmsd, 0);
-  if (i > GT_DISPLAY_MODE_MAX) {
+  if (!((i >= 0) && (i < gt_display_mode_names.size()))) {
     i = 0;
   }
-  const char* dspl_mode = gt_display_mode_names[i];
+  QString dspl_mode = gt_display_mode_names[i];
 
   int wpt_class = garmin_fs_t::get_wpt_class(gmsd, 0);
-  if (wpt_class <= gt_waypt_class_map_line) {
+  if ((wpt_class >= 0) && (wpt_class < gt_waypt_class_names.size())) {
     wpt_type = gt_waypt_class_names[wpt_class];
   } else {
     wpt_type = gt_waypt_class_names[0];
@@ -450,7 +439,7 @@ GarminTxtFormat::write_waypt(const Waypoint* wpt)
   } else {
     *fout << "\t";
   }
-  *fout << QString::asprintf("%s\t", wpt_type);
+  *fout << wpt_type << "\t";
 
   print_position(wpt);
 
@@ -475,7 +464,7 @@ GarminTxtFormat::write_waypt(const Waypoint* wpt)
   if (x != -999) {
     print_temperature(x);
   }
-  *fout << QString::asprintf("\t%s\t", dspl_mode);
+  *fout << "\t" << dspl_mode << "\t";
 
   *fout << "Unknown\t";                                /* Color is fixed: Unknown */
 
@@ -673,14 +662,14 @@ GarminTxtFormat::wr_init(const QString& fname)
     }
   }
 
-  datum_str = get_option_val(opt_datum, nullptr);
-  const char* grid_str = get_option_val(opt_grid, nullptr);
+  QString datum_str = get_option_val(opt_datum, nullptr);
+  QString grid_str = get_option_val(opt_grid, nullptr);
 
   grid_index = grid_lat_lon_dmm;
-  if (grid_str != nullptr) {
-    int i;
+  if (!grid_str.isEmpty()) {
+    bool ok;
 
-    if (sscanf(grid_str, "%d", &i)) {
+    if (int i = grid_str.toInt(&ok); ok) {
       grid_index = (grid_type) i;
       if ((grid_index < GRID_INDEX_MIN) || (grid_index > GRID_INDEX_MAX))
         fatal(MYNAME ": Grid index out of range (%d..%d)!",
@@ -752,8 +741,8 @@ GarminTxtFormat::write()
   grid_str = grid_str.replace('*', u'°');
   *fout << "Grid\t" << grid_str << "\r\n";
 
-  datum_str = gt_get_mps_datum_name(datum_index);
-  *fout << QString::asprintf("Datum\t%s\r\n\r\n", datum_str);
+  QString datum_str = gt_get_mps_datum_name(datum_index);
+  *fout << "Datum\t" << datum_str << "\r\n\r\n";
 
   waypoints = 0;
   gtxt_flags.enum_waypoints = 1;                       /* enum all waypoints */
@@ -961,7 +950,7 @@ GarminTxtFormat::parse_display(const QString& str, int* val) const
     return false;
   }
 
-  for (gt_display_modes_e i = GT_DISPLAY_MODE_MIN; i <= GT_DISPLAY_MODE_MAX; ++i) {
+  for (int i = 0; i < gt_display_mode_names.size(); ++i) {
     if (case_ignore_strcmp(str, gt_display_mode_names[i]) == 0) {
       *val = i;
       return true;
@@ -1011,13 +1000,12 @@ GarminTxtFormat::parse_grid(const QStringList& lineparts)
     fatal(MYNAME ": Missing grid headline!\n");
   }
 
-  const QByteArray ba = lineparts.at(0).toUtf8();
-  const char* str = ba.constData();
-  if (strstr(str, "dd.ddddd") != nullptr) {
+  const QString str = lineparts.at(0);
+  if (str.contains("dd.ddddd")) {
     grid_index = grid_lat_lon_ddd;
-  } else if (strstr(str, "mm.mmm") != nullptr) {
+  } else if (str.contains("mm.mmm")) {
     grid_index = grid_lat_lon_dmm;
-  } else if (strstr(str, "mm'ss.s") != nullptr) {
+  } else if (str.contains("mm'ss.s")) {
     grid_index = grid_lat_lon_dms;
   } else {
     grid_index = gt_lookup_grid_type(str, MYNAME);
@@ -1032,7 +1020,7 @@ GarminTxtFormat::parse_datum(const QStringList& lineparts)
   }
 
   const auto& str = lineparts.at(0);
-  datum_index = gt_lookup_datum_index(CSTR(str), MYNAME);
+  datum_index = gt_lookup_datum_index(str, MYNAME);
 }
 
 void
@@ -1067,7 +1055,7 @@ GarminTxtFormat::parse_waypoint(const QStringList& lineparts)
       }
       break;
     case  3:
-      for (i = 0; i <= gt_waypt_class_map_line; i++) {
+      for (i = 0; i < gt_waypt_class_names.size(); i++) {
         if (case_ignore_strcmp(str, gt_waypt_class_names[i]) == 0) {
           garmin_fs_t::set_wpt_class(gmsd, i);
           break;
index 8c29c2924b32b78f2862bcd79bb8f90bc420579a..9af5aa4421aaf3fedfe0d9ebe50189fdc8b15a4d 100644 (file)
@@ -163,7 +163,6 @@ private:
   int wpt_a_ct{};
   grid_type grid_index{};
   int datum_index{};
-  const char* datum_str{};
   int current_line{};
   QString date_time_format;
   int precision = 3;
diff --git a/gpx.cc b/gpx.cc
index 44d8f802b1c45e8996031bcad2d3705a6428bf27..5bc029e499f9dc684c187a6051046e183a42d5f9 100644 (file)
--- a/gpx.cc
+++ b/gpx.cc
@@ -1532,8 +1532,7 @@ GpxFormat::gpx_track_hdr(const route_head* rte)
       if (ci > 0) {
         writer->writeStartElement(QStringLiteral("extensions"));
         writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
-        writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
-                                 .arg(gt_color_name(ci)));
+        writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), gt_color_name(ci));
         writer->writeEndElement(); // Close gpxx:TrackExtension tag
         writer->writeEndElement(); // Close extensions tag
       }
@@ -1622,8 +1621,7 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const
         writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
         // FIXME: the value to use for IsAutoNamed is questionable.
         writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
-        writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
-                                 .arg(gt_color_name(ci)));
+        writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), gt_color_name(ci));
         writer->writeEndElement(); // Close gpxx:RouteExtension tag
         writer->writeEndElement(); // Close extensions tag
       }
index 94a7a21bc9bd77315695f8e36735eee8617cc0c6..d442a6c3924b4c11ea1d632fba2859d2e46f1aef 100644 (file)
@@ -3,31 +3,26 @@
 
 #include <algorithm>             // for sort
 #include <cstdio>                // for printf
-#include <cstring>               // for strcmp
 
+#include <QString>               // for QString, operator<
 #include <QVector>               // for QVector<>::iterator, QVector
 
-#include "garmin_icon_tables.h"  // for garmin_icon_table, garmin_smart_icon_table
-#include "garmin_tables.h"       // for icon_mapping_t
+#include "garmin_icon_tables.h"  // for icon_mapping_t, garmin_icon_table, garmin_smart_icon_table
 
 
 int main()
 {
   QVector<icon_mapping_t> table;
-  for (const icon_mapping_t* entry = garmin_icon_table; entry->icon; entry++) {
-    table.append(*entry);
-  }
-  for (const icon_mapping_t* entry = garmin_smart_icon_table; entry->icon; entry++) {
-    table.append(*entry);
-  }
+  table.append(garmin_icon_table);
+  table.append(garmin_smart_icon_table);
 
   auto sort_lambda = [](const icon_mapping_t& a, const icon_mapping_t& b)->bool {
-    return strcmp(a.icon, b.icon) < 0;
+    return a.icon < b.icon;
   };
   std::sort(table.begin(), table.end(), sort_lambda);
 
   for (const auto& entry : table) {
-    printf("    <member>%s</member>\n",entry.icon);
+    printf("    <member>%s</member>\n", qPrintable(entry.icon));
   }
 
   return 0;
index 7686d926862278377dfe6f058a8e399cc943c3f4..2b0a247dd3e2b75144d06370107e9d3aad23e864 100644 (file)
--- a/unicsv.cc
+++ b/unicsv.cc
@@ -465,7 +465,7 @@ UnicsvFormat::rd_init(const QString& fname)
   unicsv_detect = (!(global_opts.masked_objective & (WPTDATAMASK | TRKDATAMASK | RTEDATAMASK | POSNDATAMASK)));
 
   unicsv_track = unicsv_route = nullptr;
-  unicsv_datum_idx = gt_lookup_datum_index(opt_datum, MYNAME);
+  unicsv_datum_idx = gt_lookup_datum_index(opt_datum.get(), MYNAME);
 
   fin = new gpsbabel::TextStream;
   fin->open(fname, QIODevice::ReadOnly, MYNAME, opt_codec);
@@ -1091,7 +1091,7 @@ UnicsvFormat::read()
   fatal(MYNAME ": %s (%s) is outside of convertible area of grid \"%s\"!\n",
         wpt->shortname.isEmpty() ? "Waypoint" : qPrintable(wpt->shortname),
         qPrintable(pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, false)),
-        gt_get_mps_grid_longname(unicsv_grid_idx, MYNAME));
+        qPrintable(gt_get_mps_grid_longname(unicsv_grid_idx, MYNAME)));
 }
 
 void
@@ -1697,7 +1697,7 @@ UnicsvFormat::wr_init(const QString& fname)
         fatal(MYNAME ": Grid index out of range (%d..%d)!\n",
               (int)GRID_INDEX_MIN, (int)GRID_INDEX_MAX);
     } else {
-      unicsv_grid_idx = gt_lookup_grid_type(opt_grid, MYNAME);
+      unicsv_grid_idx = gt_lookup_grid_type(opt_grid.get(), MYNAME);
     }
   }
 
@@ -1711,7 +1711,7 @@ UnicsvFormat::wr_init(const QString& fname)
   {
     unicsv_datum_idx = kDatumWGS84;  /* internal, becomes CH1903 */
   } else {
-    unicsv_datum_idx = gt_lookup_datum_index(opt_datum, MYNAME);
+    unicsv_datum_idx = gt_lookup_datum_index(opt_datum.get(), MYNAME);
   }
 
   llprec = xstrtoi(opt_prec, nullptr, 10);